import org.junit.Test;

import java.io.*;

/**
 * @auther yangdong
 * @create 2020-04-15
 *  当读取数据时，数据按块读入缓冲区，其后的读操作则直接访问缓冲区
 *  当使用BufferedInputStream读取字节文件时，BufferedInputStream会一次性从
 * 文件中读取8192个(8Kb)，存在缓冲区中，直到缓冲区装满了，才重新从文件中
 * 读取下一个8192个字节数组。
 *  向流中写入字节时，不会直接写到文件，先写到缓冲区中直到缓冲区写满，
 * BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法
 * flush()可以强制将缓冲区的内容全部写入输出流
 *  关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可，关闭最外层流也
 * 会相应关闭内层节点流
 *  flush()方法的使用：手动将buffer中内容写入文件
 *  如果是带缓冲区的流对象的close()方法，不但会关闭流，还会在关闭流之前刷
 * 新缓冲区，关闭后不能再写出
 */
public class BufferTest {
    public void bufferCopy(String src,String dist){
        File file=new File(src);
        File file1=new File(dist);
        FileInputStream fis=null;
        FileOutputStream fos=null;
        BufferedInputStream bis=null;
        BufferedOutputStream bos=null;
        try {
            fis=new FileInputStream(file);
            fos=new FileOutputStream(file1);
            bis=new BufferedInputStream(fis);
            bos=new BufferedOutputStream(fos);
            byte[] b=new byte[1024];
            int len;
            while((len=bis.read(b))!=-1){
                bos.write(b,0,len);
               // bos.flush();
            }
            System.out.println("复制完成");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    @Test
    public void TestCopy(){
        long start=System.currentTimeMillis();
        bufferCopy("G:\\BaiduNetdiskDownload\\尚硅谷\\软件\\powerdesigner1029.zip","H:\\powerdesigner1029.zip");
        long end=System.currentTimeMillis();
        System.out.println("耗时"+":"+(end-start));
    }
    @Test
    public void testrwBuffer(){
        BufferedReader br=null;
        BufferedWriter bw=null;
        try {
            br=new BufferedReader(new FileReader("src/hello.txt"));
            bw=new BufferedWriter(new FileWriter("src/hello3.txt"));
            //方法1
//            char[] c=new char[100];
//            int len;
//            while((len=br.read(c))!=-1){
//                bw.write(c,0,len);
//            }
            //方法2
            String data;
            while ((data=br.readLine())!=null){
                //方法一转义换行
                //bw.write(data+"\n");
                //bw.newLine();换行
                bw.write(data);
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
